<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Documentation SimpleTest : tester des formulaires HTML</title>
<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
</head>
<body>
<div class="menu_back">
<div class="menu">
<a href="index.html">SimpleTest</a>
                |
                <a href="overview.html">Overview</a>
                |
                <a href="unit_test_documentation.html">Unit tester</a>
                |
                <a href="group_test_documentation.html">Group tests</a>
                |
                <a href="mock_objects_documentation.html">Mock objects</a>
                |
                <a href="partial_mocks_documentation.html">Partial mocks</a>
                |
                <a href="reporter_documentation.html">Reporting</a>
                |
                <a href="expectation_documentation.html">Expectations</a>
                |
                <a href="web_tester_documentation.html">Web tester</a>
                |
                <a href="form_testing_documentation.html">Testing forms</a>
                |
                <a href="authentication_documentation.html">Authentication</a>
                |
                <a href="browser_documentation.html">Scriptable browser</a>
</div>
</div>
<h1>Documentation sur les tests de formulaire</h1>
        This page...
        <ul>
<li>
            Modifier les valeurs d'un formulaire et <a href="#submit">r&eacute;ussir &agrave; transmettre un simple formulaire</a>
        </li>
<li>
            G&eacute;rer des <a href="#multiple">objets &agrave; valeurs multiples</a> en initialisant des listes.
        </li>
<li>
            <a href="#brut">Envoi brut</a> quand il n'existe pas de bouton &agrave; cliquer.
        </li>
</ul>
<div class="content">
        <p>
<a class="target" name="submit">
<h2>Valider un formulaire simple</h2>
</a>
</p>
            <p>
                Lorsqu'une page est t&eacute;l&eacute;charg&eacute;e par <span class="new_code">WebTestCase</span> en utilisant <span class="new_code">get()</span> ou <span class="new_code">post()</span> le contenu de la page est automatiquement analys&eacute;. De cette analyse d&eacute;coule le fait que toutes les commandes &agrave; l'int&eacute;rieur de la balise &lt;form&gt; sont disponibles depuis l'int&eacute;rieur du sc&eacute;nario de test. Prenons par exemple cet extrait de code HTML...
<pre>
&lt;form&gt;
    &lt;input type="text" name="a" value="A default" /&gt;
    &lt;input type="submit" value="Go" /&gt;
&lt;/form&gt;
</pre>
                Il ressemble &agrave;...
            </p>
            <p>
                <form class="demo">
                    <input type="text" name="a" value="A default">
                    <input type="submit" value="Go">
                </form>
            </p>
            <p>
                Nous pouvons naviguer vers ce code, via le site <a href="http://www.lastcraft.com/form_testing_documentation.php">LastCraft</a>, avec le test suivant...
<pre>
class SimpleFormTests extends WebTestCase {
    <strong>
    function testDefaultValue() {
        $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
        $this-&gt;assertField('a', 'A default');
    }</strong>
}
</pre>
                Directement apr&egrave;s le chargement de la page toutes les commandes HTML sont initi&eacute;es avec leur valeur par d&eacute;faut, comme elles appara&icirc;traient dans un navigateur web. L'assertion teste qu'un objet HTML avec le nom "a" existe dans la page et qu'il contient la valeur "A default".
            </p>
            <p>
                Nous pourrions retourner le formulaire tout de suite, mais d'abord nous allons changer la valeur du champ texte. Ce n'est qu'apr&egrave;s que nous le transmettrons...
<pre>
class SimpleFormTests extends WebTestCase {

    function testDefaultValue() {
        $this-&gt;get('http://www.my-site.com/');
        $this-&gt;assertField('a', 'A default');<strong>
        $this-&gt;setField('a', 'New value');
        $this-&gt;clickSubmit('Go');</strong>
    }
}
</pre>
                Parce que nous n'avons sp&eacute;cifi&eacute; ni attribut "method" sur la balise form, ni attribut "action", le sc&eacute;nario de test suivra le comportement classique d'un navigateur : transmission des donn&eacute;es avec une requ&ecirc;te <em>GET</em> vers la m&ecirc;me page. SimpleTest essaie d'&eacute;muler le comportement typique d'un navigateur autant que possible, plut&ocirc;t que d'essayer d'attraper des attributs manquants sur les balises. La raison est simple : la cible d'un framework de test est la logique d'une application PHP, pas les erreurs -- de syntaxe ou autres -- du code HTML. Pour les erreurs HTML, d'autres outils tel <a href="http://www.w3.org/People/Raggett/tidy/">HTMLTidy</a> devraient &ecirc;tre employ&eacute;s.
            </p>
            <p>
                Si un champ manque dans n'importe quel formulaire ou si une option est indisponible alors <span class="new_code">WebTestCase::setField()</span> renverra <span class="new_code">false</span>. Par exemple, supposons que nous souhaitons v&eacute;rifier qu'une option "Superuser" n'est pas pr&eacute;sente dans ce formulaire...
<pre>
&lt;strong&gt;Select type of user to add:&lt;/strong&gt;
&lt;select name="type"&gt;
    &lt;option&gt;Subscriber&lt;/option&gt;
    &lt;option&gt;Author&lt;/option&gt;
    &lt;option&gt;Administrator&lt;/option&gt;
&lt;/select&gt;
</pre>
                Qui ressemble &agrave;...
            </p>
            <p>
                <form class="demo">
                    <strong>Select type of user to add:</strong>
                    <select name="type">
                        <option>Subscriber</option>
                        <option>Author</option>
                        <option>Administrator</option>
                    </select>
                </form>
            </p>
            <p>
                Le test suivant le confirmera...
<pre>
class SimpleFormTests extends WebTestCase {
    ...
    function testNoSuperuserChoiceAvailable() {<strong>
        $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
        $this-&gt;assertFalse($this-&gt;setField('type', 'Superuser'));</strong>
    }
}
</pre>
                La s&eacute;lection ne sera pas chang&eacute;e suite &agrave; un &eacute;chec d'initialisation d'une valeur sur un objet.
            </p>
            <p>
                Voici la liste compl&egrave;te des objets support&eacute;s &agrave; aujourd'hui...
                <ul>
                    <li>Champs texte, y compris les champs masqu&eacute;s (hidden) ou crypt&eacute;s (password).</li>
                    <li>Boutons submit, en incluant aussi la balise button, mais pas encore les boutons reset</li>
                    <li>Aires texte (textarea) avec leur gestion des retours &agrave; la ligne (wrap).</li> 
                    <li>Cases &agrave; cocher, y compris les cases &agrave; cocher multiples dans un m&ecirc;me formulaire.</li>
                    <li>Listes &agrave; menu d&eacute;roulant, y compris celles &agrave; s&eacute;lections multiples.</li>
                    <li>Boutons radio.</li>
                    <li>Images.</li>
                </ul>
            </p>
            <p>
                Bien que la plupart des objets HTML standards soient couvert par le parseur de <em>SimpleTest</em>, il est peu probable que JavaScript soit impl&eacute;ment&eacute; dans un futur proche.
            </p>
        
        <p>
<a class="target" name="multiple">
<h2>Champs &agrave; valeurs multiples</h2>
</a>
</p>
            <p>
                SimpleTest peut g&eacute;rer deux types de commandes &agrave; valeur multiple : les menus d&eacute;roulants &agrave; s&eacute;lection multiple et les cases &agrave; cocher avec le m&ecirc;me nom &agrave; l'int&eacute;rieur m&ecirc;me d'un formulaire. La nature de ceux-ci implique que leur initialisation et leur test sont l&eacute;g&egrave;rement diff&eacute;rents. Voici un exemple avec des cases &agrave; cocher...
<pre>
&lt;form class="demo"&gt;
    &lt;strong&gt;Create privileges allowed:&lt;/strong&gt;
    &lt;input type="checkbox" name="crud" value="c" checked&gt;&lt;br&gt;
    &lt;strong&gt;Retrieve privileges allowed:&lt;/strong&gt;
    &lt;input type="checkbox" name="crud" value="r" checked&gt;&lt;br&gt;
    &lt;strong&gt;Update privileges allowed:&lt;/strong&gt;
    &lt;input type="checkbox" name="crud" value="u" checked&gt;&lt;br&gt;
    &lt;strong&gt;Destroy privileges allowed:&lt;/strong&gt;
    &lt;input type="checkbox" name="crud" value="d" checked&gt;&lt;br&gt;
    &lt;input type="submit" value="Enable Privileges"&gt;
&lt;/form&gt;
</pre>
                Qui se traduit par...
            </p>
            <p>
                <form class="demo">
                    <strong>Create privileges allowed:</strong>
                    <input type="checkbox" name="crud" value="c" checked>
<br>
                    <strong>Retrieve privileges allowed:</strong>
                    <input type="checkbox" name="crud" value="r" checked>
<br>
                    <strong>Update privileges allowed:</strong>
                    <input type="checkbox" name="crud" value="u" checked>
<br>
                    <strong>Destroy privileges allowed:</strong>
                    <input type="checkbox" name="crud" value="d" checked>
<br>
                    <input type="submit" value="Enable Privileges">
                </form>
            </p>
            <p>
                Si nous souhaitons d&eacute;sactiver tous les privil&egrave;ges sauf ceux de t&eacute;l&eacute;chargement (Retrieve) et transmettre cette information, nous pouvons y arriver par...
<pre>
class SimpleFormTests extends WebTestCase {
    ...<strong>
    function testDisableNastyPrivileges() {
        $this-&gt;get('http://www.lastcraft.com/form_testing_documentation.php');
        $this-&gt;assertField('crud', array('c', 'r', 'u', 'd'));
        $this-&gt;setField('crud', array('r'));
        $this-&gt;clickSubmit('Enable Privileges');
    }</strong>
}
</pre>
                Plut&ocirc;t que d'initier le champ &agrave; une valeur unique, nous lui donnons une liste de valeurs. Nous faisons la m&ecirc;me chose pour tester les valeurs attendues. Nous pouvons &eacute;crire d'autres bouts de code de test pour confirmer cet effet, peut-&ecirc;tre en nous connectant comme utilisateur et en essayant d'effectuer une mise &agrave; jour.
            </p>
            <p>
                <a class="target" name="brut">
<h2>Envoi brut</h2>
</a>
            </p>
            <p>
                Si vous souhaitez tester un gestionnaire de formulaire mais que vous ne l'avez pas &eacute;crit ou que vous n'y avez pas encore acc&egrave;s, vous pouvez cr&eacute;er un envoi de formulaire &agrave; la main.
<pre>
class SimpleFormTests extends WebTestCase {
    ...<strong>    
    function testAttemptedHack() {
        $this-&gt;post(
                'http://www.my-site.com/add_user.php',
                array('type' =&gt; 'superuser'));
        $this-&gt;assertNoUnwantedPattern('/user created/i');
    }</strong>
}
</pre>
                En ajoutant des donn&eacute;es &agrave; la m&eacute;thode <span class="new_code">WebTestCase::post()</span>, nous essayons de t&eacute;l&eacute;charger la page via la transmission d'un formulaire.
            </p>
        
    </div>
        References and related information...
        <ul>
<li>
            La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
        </li>
<li>
            La page de t&eacute;l&eacute;chargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
        </li>
<li> 
           <a href="http://simpletest.sourceforge.net/">L'API du d&eacute;veloppeur pour SimpleTest</a> donne tous les d&eacute;tails sur les classes et les assertions disponibles.
        </li>
</ul>
<div class="menu_back">
<div class="menu">
<a href="index.html">SimpleTest</a>
                |
                <a href="overview.html">Overview</a>
                |
                <a href="unit_test_documentation.html">Unit tester</a>
                |
                <a href="group_test_documentation.html">Group tests</a>
                |
                <a href="mock_objects_documentation.html">Mock objects</a>
                |
                <a href="partial_mocks_documentation.html">Partial mocks</a>
                |
                <a href="reporter_documentation.html">Reporting</a>
                |
                <a href="expectation_documentation.html">Expectations</a>
                |
                <a href="web_tester_documentation.html">Web tester</a>
                |
                <a href="form_testing_documentation.html">Testing forms</a>
                |
                <a href="authentication_documentation.html">Authentication</a>
                |
                <a href="browser_documentation.html">Scriptable browser</a>
</div>
</div>
<div class="copyright">
            Copyright<br>Marcus Baker 2006
        </div>
</body>
</html>
